package com.zj.utils.utils;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.text.TextUtils;
import android.util.Base64;


import com.zj.utils.utils.utilcode.ImageUtils;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

import top.zibin.luban.Luban;
import top.zibin.luban.OnCompressListener;

public class ImageBase64 {
    private static final ImageBase64 ourInstance = new ImageBase64();

    public static ImageBase64 getInstance() {
        return ourInstance;
    }

    private ImageBase64() {

    }

    /**
     * 将图片转换成Base64编码的字符串
     * @param path 传入图片路径
     * @return base64编码的字符串
     */
    public String imageToBase64(String path){
        if(TextUtils.isEmpty(path)){
            return null;
        }
        InputStream is = null;
        byte[] data;
        String result = null;
        try{
            is = new FileInputStream(path);
            //创建一个字符流大小的数组。
            data = new byte[is.available()];
            //写入数组
            is.read(data);
            //用默认的编码格式进行编码
            result = Base64.encodeToString(data,Base64.DEFAULT);
        }catch (IOException e){
            e.printStackTrace();
        }finally {
            if(null !=is){
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }
        return result;
    }

    /**
     * 将图片转换成Base64编码的字符串
     * @param path 传入图片路径
     * @return base64编码的字符串
     */
    public String imageTosBase64(String path){
        if(TextUtils.isEmpty(path)){
            return null;
        }
        InputStream is = null;
        byte[] data;
        String result = null;
        Bitmap bitmap= BitmapFactory.decodeFile(path);
        Bitmap.CompressFormat format = Bitmap.CompressFormat.JPEG;
        //写入数组
        try {
            data = ImageUtils.bitmap2Bytes(ImageUtils.compressByQuality(bitmap,50),format);
            is.read(data);
            //用默认的编码格式进行编码
            result = Base64.encodeToString(data,Base64.DEFAULT);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }


    /**
     * 将图片转换成Base64编码的字符串
     * @param path 传入图片路径
     * @return base64编码的字符串
     */
    public String imageToBase64(String path, Context context){
        final String[] result = {null};
        File file = new File(path);//创建文件
        Bitmap bitmap= BitmapFactory.decodeFile(path);
        ImageUtils.compressByQuality(bitmap,50);
        Luban.with(context)
                .load(file)                     // 传入要压缩的图片
                .putGear(2)      // 设定压缩档次,默认三挡自己可以选择
                .setCompressListener(new OnCompressListener() { // 设置回调

                    @Override
                    public void onStart() {
                        // 压缩开始前调用,可以在方法内启动 loading UI
                    }

                    @Override
                    public void onSuccess(File file) {
                        // 压缩成功后调用,返回压缩后的图片文件
                        result[0] =  getBase64(file);
                    }

                    @Override
                    public void onError(Throwable e) {
                    }
                }   ).launch();


        return result[0];
    }

    private String getBase64(File file) {
        if(TextUtils.isEmpty(file.getPath())){
            return null;
        }
        InputStream is = null;
        byte[] data;
        String result = null;
        try{
            is = new FileInputStream(file.getPath());
            //创建一个字符流大小的数组。
            data = new byte[is.available()];
            //写入数组
            is.read(data);
            //用默认的编码格式进行编码
            result = Base64.encodeToString(data,Base64.DEFAULT);
        }catch (IOException e){
            e.printStackTrace();
        }finally {
            if(null !=is){
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }
        return result;
    }

}
